package com.qlslylq.ad.example.application;

import android.app.Application;
import android.content.Context;
import android.os.Build;
import android.webkit.WebView;

import androidx.multidex.MultiDex;

import com.qlslylq.ad.example.BuildConfig;
import com.qlslylq.ad.example.constant.KeyConst;
import com.qlslylq.ad.example.handler.CrashHandler;
import com.qlslylq.ad.sdk.application.AdDesignSDK;
import com.qlslylq.ad.sdk.application.AdDesignSDKConfig;
import com.qlslylq.ad.sdk.core.rsp.AdError;
import com.qlslylq.ad.sdk.enums.AdPlatformEnum;
import com.qlslylq.ad.sdk.interfaces.InitCallback;
import com.qlslylq.ad.sdk.method.AppMethod;
import com.qlslylq.ad.sdk.util.GsonUtils;
import com.qlslylq.ad.sdk.util.ToastUtils;

/**
 * 程序入口<br/>
 */
public class AdApp extends Application {

    /**
     * 单例
     */
    private static AdApp app;

    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    public void onCreate() {
        super.onCreate();
        String processName = AppMethod.getCurrentProcessName(this);
        if (processName != null) {
            if (processName.equals(BuildConfig.APPLICATION_ID)) {
                initInstance();
                initCrashHandler();
                initSDK();
            } else {
                initWebviewInfoSDK28(processName);
            }
        }
    }

    private void initInstance() {
        app = this;
    }

    public static AdApp getInstance() {
        return app;
    }

    /**
     * 初始化错误收集器
     */
    private void initCrashHandler() {
        CrashHandler crashHandler = CrashHandler.getInstance();
        crashHandler.init(this);
        crashHandler.sendPreviousReportsToServer();
    }

    /**
     * 设置WebView数据缓存目录
     */
    private void initWebviewInfoSDK28(String processName) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            WebView.setDataDirectorySuffix(processName);
        }
    }

    /**
     * 初始化第三方SDK<br/>
     */
    private void initSDK() {
        initAdDesignSDK();
    }

    /**
     * 初始化广告聚合SDK<br/>
     */
    private void initAdDesignSDK() {
        AdDesignSDKConfig config = new AdDesignSDKConfig.Builder()
                .setAppId(KeyConst.JH_APP_ID)         //请重新申请，发布请换为正式的
                .setTest(false)        //[true,false]表示[测试环境，正式环境]；测试环境已不对外开放，请使用正式环境，即必须为false
                .setDebug(true)       //开启DEBUG模式，打印内部LOG并显示联盟名称提示等；发布可关闭
                .setTryAgainAdTypes(null)  //展示失败自动轮换子策略应用的广告类型，默认为null即全部开启，[]为全部不开启，[AdType.XX]为部分开启
                .setSupportThirdMode(false)  //打开聚合共存模式，[true,false]表示[开启与其它聚合广告sdk共存模式，关闭与其它聚合广告sdk共存模式]。考虑到性能，不是共存场景时请切勿打开。
                .setSplashFasterMode(true)  //打开开屏加速模式
                .build();
        AdDesignSDK.init(this, config, new InitCallback() {

            //表示已准备好，可以去加载广告了(并非表示所有联盟初始化成功了)
            //对于开屏广告，需要在load前或后做一定的延时处理，以避免code为450的情况出现。例如：
            //方式一：延时1000ms-2500ms-->load-->(可选择再次间隔一定时间如500ms-1500ms或间隔自身业务的处理)-->show
            //方式二：延时1000ms-2500ms-->loadAndShow
            //方式三：死循环等待至initSDK的success回调后再去load,show或loadAndShow。安全起见死循环应给一个极限时间即最大等候时长如2000ms。
            public void success() {

            }

            //所有初始化失败的联盟均会回调此函数，回调多次
            //对于初始化失败的联盟，SDK内部已做了策略处理；app端不需要做任何处理，仅用于调试时信息的获悉。
            public void fail(AdPlatformEnum platform, int code, String msg) {
                ToastUtils.showToast(app, platform.getId() + "初始化失败：" + GsonUtils.gsonString(AdError.build(platform, null, code, msg)));
            }
        });
    }

}
